#####################################################################
#	$Id: Log.pm,v 1.1.1.1 2006/03/20 04:08:45 jfb Exp $
#
# Log.pm - base module for the Epiphyte engine
#
#
#####################################################################

package Epiphyte::Log;

use strict;
use vars qw(@ISA @EXPORT);

use Exporter;

use constant LOGBUF_DEFSIZE	=> 100;

# Log filter operations
use constant LOG_FILTER_UNBLOCK	=> 0;
use constant LOG_FILTER_BLOCK	=> 1;

# Log levels
use constant LOG_DEBUG		=> 0;
use constant LOG_INFO		=> 1;
use constant LOG_WARN		=> 2;
use constant LOG_ERR		=> 3;
use constant LOG_ABORT		=> 4;

@ISA = qw(Exporter);
@EXPORT = qw(
	LOG_FILTER_BLOCK LOG_FILTER_UNBLOCK
	LOG_DEBUG LOG_INFO LOG_WARN LOG_ERR LOG_ABORT
);


my @log_filters = (0, 0, 0, 0, 0);


########################################################################
# new - class method
#
#
########################################################################

sub new
{
	my ($class, $ident) = @_;

	$ident = '' if (!defined($ident));

	my $self = {
		_ident	=> $ident,
		_bufsz	=> LOGBUF_DEFSIZE,
		_buf	=> [],
	};

	bless($self, $class);

	return ($self);
}


########################################################################
# filter - object method
#
# Set a filter on one or more levels
########################################################################

sub filter($$)
{
	my ($class, $op, @levels) = @_;

	foreach (@levels) {
		if (($_ < 0) || ($_ > scalar(@log_filters))) {
			$class->log(LOG_ERR, "invalid filter level `$_'");
			return;
		}

		$log_filters[$_] = $op;
	}

	return (1);
}


########################################################################
# setbuf - object method
#
# Set the maximum number of lines to keep in the log buffer
# Returns the old size on success, or -1 on error.
########################################################################

sub setbuf
{
	my ($self, $size) = @_;

	return (-1) if ($size =~ /\D/);

	my $old = $self->{_bufsz};
	$self->{_bufsz} = $size;
	return ($old);
}


########################################################################
# log - object method
#
# Output a log message through the log facility.
########################################################################

sub log($$)
{
	my ($self, $level, $msg, @args) = @_;
	my $out;
	my $line = '';

	return if ($level =~ /\D/);
	return if ($log_filters[$level]);

	$line = $self->{_ident} . ': ' if ($self->{_ident});
	$line .= $msg;

	if ($level >= LOG_ERR) {
		$out = \*STDERR;
	} else {
		$out = \*STDOUT;
	}

	$line .= join('', @args);

	print $out "$line\n";

	push(@{$self->{_buf}}, $line);
	if (scalar(@{$self->{_buf}}) >= $self->{_bufsz}) {
		shift(@{$self->{_buf}});
	}
}

1;
